home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / edo / rex / egbcall.asm < prev    next >
Assembly Source File  |  1994-06-01  |  2KB  |  84 lines

  1.     .386p
  2.  
  3. ;h:
  4. ;rexb egbcall
  5.  
  6. $biosCall    macro    data    ;本ルーチンでは未使用
  7.     mov    ah,data
  8.     push    fs
  9.     push    0110h
  10.     pop    fs
  11.     call    pword PTR fs:[0020h]
  12.     pop    fs
  13.     endm
  14.  
  15. $egb_bios    macro        ;記述の簡易化の為の1行マクロ
  16.     call    pword PTR fs:[0020h]
  17.     endm
  18.  
  19. s_param    struc
  20.     dd    ?
  21. cmd    dd    ?
  22. R_AL    dd    ?
  23. R_EBX    dd    ?
  24. R_ECX    dd    ?
  25. R_EDX    dd    ?
  26. R_ESI    dd    ?
  27. RETAD    dd    ?
  28. s_param    ends
  29.  
  30. CODE    segment dword public ER use32 'CODE'
  31.     assume cs:CODE,ds:CODE
  32.  
  33. EXEC    proc    near
  34.     cld            ;自動増加を指定
  35. ;
  36.     mov    ebp,esp        ;パラメータ位置とBASICに渡されたスタックを保存
  37.     mov    ah,byte PTR cmd[ebp]    ;EGBの機能を読む
  38.     or    ah,ah            ;0(EGB_init)か?
  39.     jne    EGB_CALL        ;0以外ならEGB呼出しへ
  40. ;
  41.     mov    edx,R_AL[ebp]    ;自前のスタックエリアアドレス(スタック末尾)
  42.     mov    ebx,R_EBX[ebp]    ;ワークエリアアドレス
  43.     mov    EGB_stack,edx    ;プログラムにスタックアドレスをセット
  44.     mov    EGB_work,ebx    ;プログラムにワークエリアアドレスをセット
  45. ;
  46. EGB_CALL:
  47.     mov    esp,EGB_stack        ;自前のスタックエリアに切り換える
  48.     push    dword PTR 0110h        ;BIOS領域のセレクタ値
  49.     pop    fs            ;BIOS領域のセレクタ値をfsにセット
  50. ;
  51.     mov    edi,EGB_work        ;ワークエリアアドレス
  52.     mov    al,byte PTR R_AL[ebp]    ;alを読み込む
  53.     mov    ebx,R_EBX[ebp]        ;ebxを読み込む
  54.     mov    ecx,R_ECX[ebp]        ;ecxを読み込む
  55.     mov    edx,R_EDX[ebp]        ;edxを読み込む
  56.     mov    esi,R_ESI[ebp]        ;esiを読み込む
  57.     $egb_bios            ;EGBをコール
  58. egb_ret:
  59.     cmp    dword PTR RETAD[ebp],0    ;レジスタ値を返すアドレスを読む
  60.     jz    skp_var            ;0なら値は返さない
  61.     push    esi            ;返す領域は6*4=24バイト必要
  62.     mov    esi,RETAD[ebp]
  63.     mov    [esi],eax
  64.     mov    4[esi],ebx
  65.     mov    8[esi],ecx
  66.     mov    12[esi],edx
  67.     mov    16[esi],esi
  68.     mov    edx,esi
  69.     pop    esi
  70.     mov    20[edx],edi
  71. skp_var:
  72.     mov    esp,ebp            ;スタックを元に戻す
  73.     movzx    eax,ah            ;エラー情報をeaxにセット
  74.     ret
  75. EXEC    endp
  76.  
  77.     align    4
  78. EGB_stack    dd    ?
  79. EGB_work    dd    ?
  80. ;
  81. CODE    ends
  82.  
  83.     end
  84.